package com.fx.spring.util;

import javafx.fxml.FXMLLoader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.URL;

/**
 * @author ClanMy
 */
public class FxmlLoaderUtil {
    private static final Logger logger = LoggerFactory.getLogger(FxmlLoaderUtil.class);
    // JavaFX日志器
    //Logging.getJavaFXLogger().info("");

    /** 自定义，从SpringContext中获取controller实例 */
    public static FXMLLoader getFxmlLoader(Object controller) {
        FXMLLoader fxmlLoader = new FXMLLoader();
        if (controller != null) {
            fxmlLoader.setControllerFactory((parameter) -> controller);
        } else {
            fxmlLoader.setControllerFactory(SpringContextUtil::getBean);
        }
        return fxmlLoader;
    }

    /**
     * 加载FXML
     *
     * @param fxmlLoader 自定义控制器获取方式的 fxmlLoader
     * @param <T>        T
     * @return 加载的FXML根节点
     */
    public static <T> T load(FXMLLoader fxmlLoader) {
        T load = null;
        try {
            load = fxmlLoader.load();
        } catch (Exception e) {
            logger.error("fxml资源文件[{}]加载失败", fxmlLoader.getLocation(), e);
        }
        return load;
    }


    /**
     * 获取 fxml
     *
     * @param url fxml url
     * @return 获取的组件
     */
    public static <T> T load(FXMLLoader fxmlLoader, String url) {
        T load = null;
        try {
            fxmlLoader.setLocation(getUrl(url));
            load = fxmlLoader.load();
        } catch (Exception e) {
            logger.error("fxml资源文件[{}]加载失败", url, e);
        }
        return load;
    }

    /**
     * 获取 fxml
     *
     * @param aClass 目标类
     * @param url    fxml url
     * @return 获取的组件
     */
    public static <T> T load(Class<T> aClass, String url) {
        return load(url);
    }

    /**
     * 获取 fxml
     *
     * @param url fxml url
     * @return 获取的组件
     */
    public static <T> T load(String url) {
        T load = null;
        try {
            FXMLLoader fxmlLoader = getFxmlLoader(null);
            fxmlLoader.setLocation(getUrl(url));
            load = fxmlLoader.load();
        } catch (Exception e) {
            logger.error("fxml资源文件[{}]加载失败", url, e);
        }
        return load;
    }

    /**
     * 获取URL地址
     *
     * @param url url
     * @return 返回URL地址
     */
    public static URL getUrl(String url) {
        return FxmlLoaderUtil.class.getResource(url);
    }


}
